package org.langqiao.io;

import java.awt.*;  
import java.awt.event.*;

public class Calculator {
	
	public static void main(String[] args) {
		CalFrame f = new CalFrame();
	}
}

class CalFrame extends Frame {
	double d1, d2;
	int op = -1;
	TextField tf;
	CalPanelL p1;
	CalPanelR p2;
  
	CalFrame() {
		super("Small Calculator");
	    setLayout(new FlowLayout(FlowLayout.CENTER,8,10));
	    setBackground(new Color(100,150,150));
	    setForeground(Color.white);
	    setResizable(false);
	    setSize(300,200);

	    tf = new TextField(22);
	    tf.setEditable(false);
	    tf.setBackground(new Color(108,118,103));
	    tf.setForeground(Color.white);
	    tf.setFont(new Font("Arial",Font.BOLD,16));
	    add(tf);
	    p1 = new CalPanelL();
	    p2 = new CalPanelR();
	    add(p1);
	    add(p2);
	    
	    setVisible(true);
	    addWindowListener(new Wclose());
	}

  // inner class:CalButton
  class CalButton extends Button {
    CalButton(String s){
      super(s);
      setBackground(Color.gray);
    }
  }

  // inner class: CalPanelL
  class CalPanelL extends Panel {
    CalButton b0, b1, b2, b3,
              b4, b5, b6, b7,
              b8, b9, bPN, bPoint;
    CalPanelL() {
      setLayout(new GridLayout(4,3));
      setFont(new Font("TimesRoman",Font.BOLD,16));
      b0 = new CalButton("0"); 
      b1 = new CalButton("1"); 
      b2 = new CalButton("2"); 
      b3 = new CalButton("3"); 
      b4 = new CalButton("4"); 
      b5 = new CalButton("5"); 
      b6 = new CalButton("6"); 
      b7 = new CalButton("7"); 
      b8 = new CalButton("8"); 
      b9 = new CalButton("9"); 
      bPN = new CalButton("+/-");
      bPoint = new CalButton("."); 
      // 加入按钮
      add(b7);  b7.addActionListener(new PressB7());  
      add(b8);  b8.addActionListener(new PressB8());  
      add(b9);  b9.addActionListener(new PressB9());  
      add(b4);  b4.addActionListener(new PressB4());  
      add(b5);  b5.addActionListener(new PressB5());  
      add(b6);  b6.addActionListener(new PressB6());  
      add(b1);  b1.addActionListener(new PressB1());  
      add(b2);  b2.addActionListener(new PressB2());  
      add(b3);  b3.addActionListener(new PressB3());  
      add(b0);  b0.addActionListener(new PressB0());  
      add(bPN); bPN.addActionListener(new PressBPN()); ;
      add(bPoint);  bPoint.addActionListener(new PressBPoint()); 
    }
  }

  class CalPanelR extends Panel {
    CalButton bAdd, bSub, bMul, bDiv,
              bSqrt, bSin, bCos, bYx,
              bLn, bEqual, bCE, bBack;
    CalPanelR() {
      setLayout(new GridLayout(4,3));
      setFont(new Font("TimesRoman",Font.BOLD,16));
      bAdd = new CalButton("+");   
      bSub = new CalButton("-");   
      bMul = new CalButton("*");   
      bDiv = new CalButton("/");   
      bSqrt = new CalButton("sqrt"); 
      bSin = new CalButton("sin");   
      bCos = new CalButton("cos");   
      bYx = new CalButton("y^x");    
      bLn = new CalButton("ln");     
      bEqual = new CalButton("=");   
      bCE = new CalButton("CE");     
      bBack = new CalButton("<-");   
      add(bDiv);  bDiv.addActionListener(new PressBDiv()); 
      add(bSqrt);  bSqrt.addActionListener(new PressBSqrt()); 
      add(bLn);  bLn.addActionListener(new PressBLn()); 
      add(bMul);  bMul.addActionListener(new PressBMul()); 
      add(bSin);  bSin.addActionListener(new PressBSin()); 
      add(bBack);  bBack.addActionListener(new PressBBack()); 
      add(bSub);  bSub.addActionListener(new PressBSub()); 
      add(bCos);  bCos.addActionListener(new PressBCos()); 
      add(bCE);  bCE.addActionListener(new PressBCE()); 
      add(bAdd);  bAdd.addActionListener(new PressBAdd()); 
      add(bYx);  bYx.addActionListener(new PressBYx()); 
      add(bEqual);  bEqual.addActionListener(new PressBEqual()); 
    }
  }

  class PressBAdd implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
        d1 = Double.parseDouble(tf.getText());
        op = 0;
        tf.setText("");
      } catch(Exception ee) {}
    }
  }

  class PressBSub implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
        d1 = Double.parseDouble(tf.getText());
        op = 1;
        tf.setText("");
      } catch(Exception ee) {}
    }
  }

  
  class PressBMul implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	d1 = Double.parseDouble(tf.getText());
        op = 2;
        tf.setText("");
      } catch(Exception ee) {}
    }
  }

  class PressBDiv implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	d1 = Double.parseDouble(tf.getText());
        op = 3;
        tf.setText("");
      } catch(Exception ee) {}
    }
  }

  class PressBYx implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	d1 = Double.parseDouble(tf.getText());
        op = 4;
        tf.setText("");
      } catch(Exception ee) {}
    }
  }
  
  class PressBEqual implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	double result = 0;
        d2 = Double.parseDouble(tf.getText());
        switch(op) {
      	  case 0:
      	    result = d1 + d2;
      	    break;
          case 1:
            result = d1 - d2;
            break;
          case 2:
            result = d1 * d2;
            break;
          case 3:
            result = d1 / d2;
            break;
          case 4:
            result = Math.pow(d1,d2);
            break;
          default:
        }
        tf.setText(String.valueOf(result));
      } catch(Exception ee) {}
    }
  }
  
  class PressBSqrt implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	double x = Double.parseDouble(tf.getText());
        double y;
        y = Math.sqrt(x);
        tf.setText(y+"");
      } catch(Exception ee) {}
    }
  }

  class PressBLn implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	double x = Double.parseDouble(tf.getText());
        double y;
        y = Math.log(x);
        tf.setText(y+"");
      } catch(Exception ee) {}
    }
  }

  class PressBSin implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	double x = Double.parseDouble(tf.getText());
        double y;
        y = Math.sin(x);
        tf.setText(y+"");
      } catch(Exception ee) {}
    }
  }
    
  class PressBCos implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	double x = Double.parseDouble(tf.getText());
        double y;
        y = Math.cos(x);
        tf.setText(y+"");
      } catch(Exception ee) {}
    }
  }

  class PressBBack implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	String text = tf.getText();
        text = text.substring(0,text.length()-1);
        tf.setText(text);
      } catch(Exception ee) {}
    }
  }
  
  class PressBCE implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      tf.setText("");
    }
  }
  
  class PressBPN implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
        String text = tf.getText();
        if (text != "") {
          if(text.charAt(0) == '-')
            tf.setText(text.substring(1));
          else if(text.charAt(0) >= '0' && text.charAt(0) <= '9')
            tf.setText("-"+text.substring(0));
          else if(text.charAt(0) == '.')
            tf.setText("-0"+text.substring(0));
        }
      } catch(Exception ee) { }
      	
   }
  }
  
  class PressBPoint implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      if(text.lastIndexOf(".") == -1)
        tf.setText(text+".");
    }
  }
      
  class PressB0 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
        tf.setText(text+"0");
    }
  }
  
  class PressB1 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"1");
    }
  }

  class PressB2 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"2");
    }
  }

  class PressB3 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"3");
    }
  }

  class PressB4 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"4");
    }
  }

  class PressB5 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"5");
    }
  }

  class PressB6 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"6");
    }
  }

  class PressB7 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"7");
    }
  }

  class PressB8 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"8");
    }
  }

  class PressB9 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"9");
    }
  }

  // class: Wclose
  class Wclose extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
      System.exit(0); 
    }
  }
}
